Adding some more judges, here and there.
[and.git] / lib / Mi manual de algoritmos / version_world_finals_2009 / src / dp / particion_troncos.cpp
blob178935b9c87b06736d68bd6ca80e4abfa33d0be5
1 /*
2 O(n^3)
3 dp[i][j] = Mínimo costo de partir la cadena entre las
4 particiones i e j, ambas incluídas.
5 */
6 int dp[1005][1005];
7 int p[1005];
9 int cubic(){
10 int n, m;
11 while (scanf("%d %d", &n, &m)==2){
12 p[0] = 0;
13 for (int i=1; i<=m; ++i){
14 scanf("%d", &p[i]);
16 p[m+1] = n;
17 m += 2;
19 for (int i=0; i<m; ++i){
20 dp[i][i+1] = 0;
23 for (int i=m-2; i>=0; --i){
24 for (int j=i+2; j<m; ++j){
25 dp[i][j] = p[j]-p[i];
26 int t = INT_MAX;
27 for (int k=i+1; k<j; ++k){
28 t = min(t, dp[i][k] + dp[k][j]);
30 dp[i][j] += t;
34 printf("%d\n", dp[0][m-1]);
36 return 0;
41 O(n^2)
43 dp[i][j] = Mínimo costo de partir la cadena entre las
44 particiones i e j, ambas incluídas. pivot[i][j] = Índice de
45 la partición que usé para lograr dp[i][j].
47 int dp[1005][1005], pivot[1005][1005];
48 int p[1005];
50 int quadratic(){
51 int n, m;
52 while (scanf("%d %d", &n, &m)==2){
53 p[0] = 0;
54 for (int i=1; i<=m; ++i){
55 scanf("%d", &p[i]);
57 p[m+1] = n;
58 m += 2;
60 for (int i=0; i<m-1; ++i){
61 dp[i][i+1] = 0;
63 for (int i=0; i<m-2; ++i){
64 dp[i][i+2] = p[i+2] - p[i];
65 pivot[i][i+2] = i+1;
68 for (int d=3; d<m; ++d){ //d = longitud
69 for (int j, i=0; (j = i + d) < m; ++i){
70 dp[i][j] = p[j] - p[i];
71 int t = INT_MAX, s;
72 for (int k=pivot[i][j-1]; k<=pivot[i+1][j]; ++k){
73 int x = dp[i][k] + dp[k][j];
74 if (x < t) t = x, s = k;
76 dp[i][j] += t, pivot[i][j] = s;
80 printf("%d\n", dp[0][m-1]);
82 return 0;